package cn.com.zaprk;

import cn.com.zaprk.utils.JDBCUtils;
import cn.com.zaprk.utils.JDBCUtils01;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @PackageName: cn.com.zaprk
 * @ClassName: JDBC_04_Transaction
 * @Description:JDBC操作事务
 * @author: RZS
 * @date: 2021/10/31  15:39
 */
public class JDBC_04_Transaction {
    /**
     * 1、获取连接
     * ​		2、开启事务
     * ​		3、获取到 PreparedStatement
     * ​		4、使用 PreparedStatement 执行两次更新操作
     * ​		5、正常情况下提交事务
     * ​		6、出现异常回滚事务
     * ​		7、最后关闭资源
     * @param args
     */
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement stat1 = null;
        PreparedStatement stat2 = null;

        // 1、获取连接
        try {
            conn = JDBCUtils01.getConn();
            // 2、开启事务
            conn.setAutoCommit(false);

            // 创建sql语句
            String sql1 = "update user set money=? where id=?";// 张三账户-100
            String sql2 = "update user set money=? where id=?";// 李四的账户+100

            // 3、获取到 PreparedStatement
            stat1 = conn.prepareStatement(sql1);
            stat2 = conn.prepareStatement(sql2);

            // 替换stat1占位符
            stat1.setDouble(1, 900);
            stat1.setInt(2, 1);

            // 替换stat2占位符
            stat2.setDouble(1, 1100);
            stat2.setInt(2, 2);

            // 执行预编译sql
            stat1.executeUpdate();
            int num = 2/0;
            stat2.executeUpdate();

            // 提交事务
            conn.commit();
        } catch (Exception e) {
            // 回滚事务
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            // 关闭连接
            JDBCUtils01.close(null, conn, stat1, stat2);
        }
    }
}
